home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / System / XFD / Developer / Sources / ASM / GP.a < prev    next >
Encoding:
Text File  |  2001-09-16  |  11.6 KB  |  650 lines

  1. *******************************************************
  2. **      XFD external decruncher for GP Cruncher      **
  3. **        written by Mr. Larmer / Wanted Team        **
  4. **       shortened and fixed by SDI in 1999           **
  5. *******************************************************
  6.  
  7.         INCLUDE    AINCLUDE:IncDirs.i
  8.         INCLUDE    "libraries/xfdmaster.i"
  9.  
  10.         * head function for tests
  11. *        INCLUDE    "xfdExeHead.a"
  12.  
  13. ; xfdForeman structure MUST be first thing in all external decrunchers
  14.  
  15. ForeMan        moveq    #-1,d0        ;security
  16.         rts
  17.         dc.l    XFDF_ID        ;id
  18.         dc.w    1        ;version
  19.         dc.w    0
  20.         dc.l    0,0        ;private
  21.         dc.l    S_GP        ;first slave
  22.  
  23.         dc.b    "$VER: GP 2.1 (17.10.2000)",0
  24. N_GP        dc.b    "(GP) Data Cruncher",0
  25.         EVEN
  26.  
  27. **************************************************
  28.  
  29. ; xfdSlave structure: this one doesn't support segment decrunching
  30.  
  31. S_GP        dc.l    0        ;no more slaves
  32.         dc.w    2        ;version
  33.         dc.w    39        ;master version
  34.         dc.l    N_GP        ;name
  35.         dc.w    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  36.         dc.w    0
  37.         dc.l    RB_GP        ;recog buffer
  38.         dc.l    DB_GP        ;decrunch buffer
  39.         dc.l    0        ;recog segment
  40.         dc.l    0        ;decrunch segment
  41.         dc.w    0,0
  42.         dc.l    12+2
  43.  
  44. ;-------------------------------------------------
  45.  
  46. RB_GP        MOVEQ    #0,D0
  47.         CMP.W    #"GP",(A0)
  48.         BNE.B    .Exit
  49.         TST.B    2(A0)
  50.         BNE.B    .Exit
  51.         MOVE.L    2(A0),D0
  52.         MOVE.L    D0,xfdrr_FinalTargetLen(A1)
  53.         ADDI.L    #8192,D0    * post and pre buffer
  54.         MOVE.L    D0,xfdrr_MinTargetLen(A1)
  55.         MOVE.L    8(A0),D0
  56.         ADDI.L    #12,D0
  57.         MOVE.L    D0,xfdrr_MinSourceLen(A1)
  58.         MOVEQ    #1,D0
  59. .Exit        RTS
  60.  
  61. ;-------------------------------------------------
  62.  
  63. DB_GP        MOVEM.L    D2-D7/A2-A6,-(A7)
  64.         MOVE.L    xfdbi_UserTargetBuf(A0),A1
  65.         MOVE.L    xfdbi_SourceBuffer(A0),A0
  66.  
  67.         MOVE.L    A1,A2
  68.         LEA    4096(A1),A1
  69.         BSR.B    D_GP
  70.         
  71.         MOVEQ    #1,D0
  72. .Exit        MOVEM.L    (A7)+,D2-D7/A2-A6
  73.         RTS
  74.  
  75. **************************************************
  76.  
  77. D_GP        MOVE.L    A2,-(A7)
  78.         ADDQ.L    #2,A0
  79.         MOVE.L    (A0)+,D0    * destination length
  80.         MOVE.W    (A0)+,D1
  81.         MOVE.L    (A0)+,D3    * source length
  82.         MOVE.W    D1,D2
  83.         ANDI.W    #7,D1        * Flags
  84.         LSR.W    #4,D2
  85.         ADD.W    D2,D2
  86.         MOVEA.L    A1,A6
  87.         SUBA.W    D2,A6
  88. .GP03:        MOVEA.L    A6,A5        * A5 = early buffer start (A1-D2)
  89.         MOVEA.L    A1,A6        * real buffer start
  90.         ADDA.L    D0,A6        * A6 = real buffer end
  91.  
  92.         btst    #2,D1
  93.         bne.s    .GP04
  94.         MOVEA.L    A0,A3        * current data start
  95.         MOVEA.L    A5,A4
  96.         BSR.W    GPmemcpy    * copy source to early start
  97.         MOVEA.L    A4,A1        * early start 
  98.         ADDA.L    D3,A1        * A1 = early source end
  99.         bra.s    .GP05
  100.  
  101. .GP04        MOVEA.L    A5,A1
  102.         BSR.W    GPSub3
  103.  
  104. .GP05        BTST    #1,D1
  105.         BNE.B    .GP06
  106.         MOVEA.L    A5,A3        * early start
  107.         MOVEA.L    A6,A4        * real buf end
  108.         SUBA.L    D3,A4
  109.         BSR.W    GPmemcpy    * copy source to end of real buffer
  110.         MOVEA.L    A4,A2        * A2 is source start
  111.         BRA.B    .GP07
  112.  
  113. .GP06:        MOVEA.L    A1,A0
  114.         MOVEA.L    A5,A1
  115.         MOVEA.L    A2,A3        * A3 is GP stack
  116.         MOVEA.L    A6,A2
  117.         BSR.B    GPSub1
  118. .GP07:        BTST    #0,D1
  119.         BNE.B    .GP08
  120.         MOVEA.L    A2,A3
  121.         BRA.B    .GP09
  122.  
  123. .GP08:        MOVEA.L    A2,A0
  124.         MOVEA.L    A5,A1
  125.         MOVEA.L    A6,A2
  126.         BSR.W    GPSub2
  127.         MOVEA.L    A5,A3
  128. .GP09:        MOVEA.L    (A7)+,A4
  129.         MOVE.L    D0,D3
  130.         BSR.W    GPmemcpy
  131.         RTS
  132.  
  133. GPSub1:        MOVEM.L    D0-D2/A3/A5/A6,-(A7)
  134.         MOVEA.L    A3,A5
  135.         MOVEA.L    A5,A6
  136.         MOVEQ    #0,D7
  137.         LEA    .GPSub1_06(PC),A4
  138. .GPSub1_01:    MOVE.L    A4,(A6)+
  139.         SUBQ.B    #1,D7
  140.         BNE.B    .GPSub1_01
  141.         LEA    .GPData2(PC),A6
  142.         LEA    GPSub1(PC),A3
  143.         MOVEQ    #9,D7
  144. .GPSub1_02:    MOVEQ    #0,D6
  145.         MOVE.B    -(A0),D6
  146.         LSL.W    #2,D6
  147.         MOVE.W    (A6)+,D5
  148.         EXT.L    D5
  149.         ADD.L    A3,D5
  150.         MOVE.L    D5,(A5,D6.W)
  151.         DBF    D7,.GPSub1_02
  152.         LEA    .Mid2(PC),A3
  153.         MOVEQ    #15,D7
  154. .GPSub1_03:    MOVEQ    #0,D6
  155.         MOVE.B    -(A0),D6
  156.         LSL.W    #2,D6
  157.         MOVE.L    A3,(A5,D6.W)
  158.         ADDQ.L    #6,A3
  159.         DBF    D7,.GPSub1_03
  160.         MOVEQ    #0,D6
  161.         MOVE.B    -(A0),D6
  162.         LSL.W    #2,D6
  163.         LEA    .GPSub1_28(PC),A3
  164.         MOVE.L    A3,(A5,D6.W)
  165.         LEA    .Mid1(PC),A4
  166. .GPSub1_04:    CMPA.L    A1,A0
  167.         BLS.B    .End
  168.         MOVE.B    -(A0),D0
  169.         MOVEQ    #0,D1
  170.         MOVE.B    D0,D1
  171.         ADD.W    D1,D1
  172.         ADD.W    D1,D1
  173.         MOVEA.L    (A5,D1.W),A3
  174. .GPSub1_05:    JMP    (A3)
  175. .End        MOVEM.L    (A7)+,D0-D2/A3/A5/A6
  176.         RTS
  177.  
  178. .GPSub1_06:    MOVE.B    D0,-(A2)
  179.         BRA.B    .GPSub1_04
  180.  
  181. .GPSub1_07:    MOVEQ    #0,D1
  182.         MOVE.B    -(A0),D1
  183.         BEQ.B    .GPSub1_06
  184.         LEA    (A2,D1.W),A6
  185.         MOVE.B    -(A6),-(A2)
  186.         MOVE.B    -(A6),-(A2)
  187.         MOVE.B    -(A6),-(A2)
  188.         MOVE.B    -(A6),-(A2)
  189. .Mid1:        MOVE.B    -(A6),-(A2)
  190.         MOVE.B    -(A6),-(A2)
  191.         MOVE.B    -(A6),-(A2)
  192.         BRA.B    .GPSub1_04
  193.  
  194. .GPSub1_08:    MOVE.B    -(A0),D1
  195.         MOVE.B    D1,D2
  196.         ANDI.W    #$FC,D1
  197.         BEQ.B    .GPSub1_06
  198.         LSR.W    #2,D1
  199.         ANDI.W    #3,D2
  200.         LEA    (A2,D1.W),A6
  201.         ADD.W    D2,D2
  202.         NEG.W    D2
  203. .GPSub1_09:    JMP    (A4,D2.W)
  204.  
  205. .GPSub1_10:    MOVEQ    #0,D2
  206.         MOVE.B    -(A0),D2
  207.         BEQ.B    .GPSub1_06
  208.         MOVE.W    D2,D1
  209.         LSR.W    #2,D2
  210.         LSL.W    #8,D1
  211.         MOVE.B    -(A0),D1
  212.         ANDI.W    #$3FF,D1
  213.         LEA    1(A2,D1.W),A6
  214.         MOVE.B    -(A6),-(A2)
  215.         MOVE.B    -(A6),-(A2)
  216. .GPSub1_11:    MOVE.B    -(A6),-(A2)
  217.         DBF    D2,.GPSub1_11
  218.         BRA.B    .GPSub1_04
  219.  
  220. .GPSub1_12:    MOVEQ    #0,D1
  221.         MOVE.B    -(A0),D1
  222.         BEQ.B    .GPSub1_06
  223.         LSL.W    #8,D1
  224.         MOVE.B    -(A0),D1
  225.         CMP.W    #-$4000,D1
  226.         BCC.B    .GPSub1_13
  227.         LEA    (A2,D1.L),A6
  228.         MOVE.B    -(A6),-(A2)
  229.         MOVE.B    -(A6),-(A2)
  230.         MOVE.B    -(A6),-(A2)
  231.         MOVE.B    -(A6),-(A2)
  232.         BRA.W    .GPSub1_04
  233.  
  234. .GPSub1_13:    MOVE.W    #$0401,D3
  235. .GPSub1_14:    ANDI.W    #$3FFF,D1
  236.         MOVE.B    D1,D2
  237.         ANDI.W    #7,D2
  238.         LSR.W    #3,D1
  239.         ADD.W    D3,D1
  240.         LEA    (A2,D1.W),A6
  241.         MOVE.B    -(A6),-(A2)
  242.         MOVE.B    -(A6),-(A2)
  243.         MOVE.B    -(A6),-(A2)
  244. .GPSub1_15:    MOVE.B    -(A6),-(A2)
  245.         DBF    D2,.GPSub1_15
  246.         BRA.W    .GPSub1_04
  247.  
  248. .GPSub1_16:    MOVEQ    #0,D1
  249.         MOVE.B    -(A0),D1
  250.         BEQ.W    .GPSub1_06
  251.         LSL.W    #8,D1
  252.         MOVE.B    -(A0),D1
  253.         MOVE.W    #$2C01,D3
  254.         CMP.W    #-$4000,D1
  255.         BCC.B    .GPSub1_14
  256.         MOVEQ    #0,D2
  257.         MOVE.B    -(A0),D2
  258.         SUBQ.W    #1,D2
  259.         SUBI.W    #$100,D1
  260.         LEA    (A2,D1.L),A6
  261. .GPSub1_17:    MOVE.B    -(A6),-(A2)
  262.         DBF    D2,.GPSub1_17
  263.         BRA.W    .GPSub1_04
  264.  
  265. .GPSub1_18:    MOVE.W    #$0C01,D3
  266.         BRA.B    .GPSub1_23
  267.  
  268. .GPSub1_19:    MOVE.W    #$9401,D3
  269.         BRA.B    .GPSub1_23
  270.  
  271. .GPSub1_20:    MOVE.W    #$7401,D3
  272.         BRA.B    .GPSub1_23
  273.  
  274. .GPSub1_21:    MOVE.W    #$5401,D3
  275.         BRA.B    .GPSub1_23
  276.  
  277. .GPSub1_22:    MOVE.W    #$3401,D3
  278. .GPSub1_23:    MOVEQ    #0,D2
  279.         MOVE.B    -(A0),D2
  280.         BEQ.W    .GPSub1_06
  281.         MOVE.L    D2,D1
  282.         LSR.W    #5,D2
  283.         LSL.W    #8,D1
  284.         MOVE.B    -(A0),D1
  285.         ANDI.W    #$1FFF,D1
  286.         ADD.W    D3,D1
  287.         LEA    (A2,D1.L),A6
  288.         MOVE.B    -(A6),-(A2)
  289.         MOVE.B    -(A6),-(A2)
  290.         MOVE.B    -(A6),-(A2)
  291. .GPSub1_24:    MOVE.B    -(A6),-(A2)
  292.         DBF    D2,.GPSub1_24
  293.         BRA.W    .GPSub1_04
  294.  
  295. .Mid2:        MOVE.W    #$003F,D3
  296.         BRA.B    .GPSub1_25
  297.  
  298.         MOVE.W    #$007E,D3
  299.         BRA.B    .GPSub1_25
  300.  
  301.         MOVE.W    #$00BD,D3
  302.         BRA.B    .GPSub1_25
  303.  
  304.         MOVE.W    #$00FC,D3
  305.         BRA.B    .GPSub1_25
  306.  
  307.         MOVE.W    #$013B,D3
  308.         BRA.B    .GPSub1_25
  309.  
  310.         MOVE.W    #$017A,D3
  311.         BRA.B    .GPSub1_25
  312.  
  313.         MOVE.W    #$01B9,D3
  314.         BRA.B    .GPSub1_25
  315.  
  316.         MOVE.W    #$01F8,D3
  317.         BRA.B    .GPSub1_25
  318.  
  319.         MOVE.W    #$0237,D3
  320.         BRA.B    .GPSub1_25
  321.  
  322.         MOVE.W    #$0276,D3
  323.         BRA.B    .GPSub1_25
  324.  
  325.         MOVE.W    #$02B5,D3
  326.         BRA.B    .GPSub1_25
  327.  
  328.         MOVE.W    #$02F4,D3
  329.         BRA.B    .GPSub1_25
  330.  
  331.         MOVE.W    #$0333,D3
  332.         BRA.B    .GPSub1_25
  333.  
  334.         MOVE.W    #$0372,D3
  335.         BRA.B    .GPSub1_25
  336.  
  337.         MOVE.W    #$03B1,D3
  338.         BRA.B    .GPSub1_25
  339.  
  340.         MOVE.W    #$03F0,D3
  341.         BRA.B    .GPSub1_25
  342.  
  343.         MOVE.W    #$042F,D3
  344. .GPSub1_25:    MOVE.B    -(A0),D1
  345.         MOVE.B    D1,D2
  346.         ANDI.W    #$FC,D1
  347.         BEQ.W    .GPSub1_06
  348.         LSR.W    #2,D1
  349. .GPSub1_26:    ANDI.W    #3,D2
  350.         ADD.W    D3,D1
  351.         LEA    (A2,D1.W),A6
  352.         MOVE.B    -(A6),-(A2)
  353.         MOVE.B    -(A6),-(A2)
  354. .GPSub1_27:    MOVE.B    -(A6),-(A2)
  355.         DBF    D2,.GPSub1_27
  356.         BRA.W    .GPSub1_04
  357.  
  358. .GPSub1_28:    MOVE.B    -(A0),D1
  359.         BEQ.W    .GPSub1_06
  360.         MOVE.B    D1,D2
  361.         ANDI.W    #$3F,D1
  362.         ROL.B    #2,D2
  363.         ANDI.W    #3,D2
  364.         ADD.W    D2,D2
  365.         LEA    .GPData(PC),A6
  366.         MOVE.W    (A6,D2.W),D3
  367.         EXT.L    D3
  368.         MOVE.B    -(A0),D4
  369.         ROR.L    #8,D4
  370.         MOVE.B    -(A0),D4
  371.         ROR.L    #8,D4
  372.         MOVE.B    -(A0),D4
  373.         ROR.L    #8,D4
  374.         MOVE.B    -(A0),D4
  375.         ROR.L    #8,D4
  376. .GPSub1_29:    MOVE.B    D4,-(A2)
  377.         ROR.L    #8,D4
  378.         MOVE.B    D4,-(A2)
  379.         ROR.L    #8,D4
  380.         MOVE.B    D4,-(A2)
  381.         ROR.L    #8,D4
  382.         MOVE.B    D4,-(A2)
  383.         ROR.L    #8,D4
  384.         MOVEQ    #0,D5
  385.         MOVE.B    -(A0),D5
  386.         ADD.L    D3,D5
  387.         SUB.L    D5,D4
  388.         DBF    D1,.GPSub1_29
  389.         ADDQ.L    #1,A0
  390.         BRA.W    .GPSub1_04
  391.  
  392. .GPData:    DC.W    -$80,0,$100,$200
  393. .GPData2:    DC.W    .GPSub1_07-(GPSub1)
  394.         DC.W    .GPSub1_08-(GPSub1)
  395.         DC.W    .GPSub1_10-(GPSub1)
  396.         DC.W    .GPSub1_12-(GPSub1)
  397.         DC.W    .GPSub1_18-(GPSub1)
  398.         DC.W    .GPSub1_16-(GPSub1)
  399.         DC.W    .GPSub1_22-(GPSub1)
  400.         DC.W    .GPSub1_21-(GPSub1)
  401.         DC.W    .GPSub1_20-(GPSub1)
  402.         DC.W    .GPSub1_19-(GPSub1)
  403.  
  404. GPSub2:        MOVEM.L    D0-D2/A3/A5/A6,-(A7)
  405.         MOVE.B    (A0)+,D5
  406.         MOVE.B    (A0)+,D6
  407.         MOVE.B    (A0)+,D7
  408. .GPSub2_01:    CMPA.L    A2,A0
  409.         BCC.W    .End
  410.         MOVE.B    (A0)+,D0
  411.         CMP.B    D5,D0
  412.         BEQ.B    .GPSub2_03
  413.         CMP.B    D6,D0
  414.         BEQ.B    .GPSub2_04
  415.         CMP.B    D7,D0
  416.         BEQ.B    .GPSub2_05
  417. .GPSub2_02:    MOVE.B    D0,(A1)+
  418.         BRA.B    .GPSub2_01
  419.  
  420. .GPSub2_03:    MOVEQ    #0,D2
  421.         MOVE.B    (A0)+,D2
  422.         BEQ.B    .GPSub2_02
  423.         MOVEQ    #0,D1
  424.         BRA.B    .GPSub2_06
  425.  
  426. .GPSub2_04:    MOVE.B    (A0)+,D1
  427.         BEQ.B    .GPSub2_02
  428.         MOVE.B    D1,(A1)+
  429.         MOVE.B    D1,(A1)+
  430.         MOVE.B    D1,(A1)+
  431.         BRA.B    .GPSub2_01
  432.  
  433. .GPSub2_05:    MOVE.B    (A0)+,D1
  434.         BEQ.B    .GPSub2_02
  435.         MOVEQ    #0,D2
  436.         MOVE.B    (A0)+,D2
  437. .GPSub2_06:    SUBQ.B    #3,D2
  438.         BCS.B    .GPSub2_08
  439.         MOVE.B    D1,(A1)+
  440.         MOVE.B    D1,(A1)+
  441. .GPSub2_07:    MOVE.B    D1,(A1)+
  442.         DBF    D2,.GPSub2_07
  443.         BRA.B    .GPSub2_01
  444.  
  445. .GPSub2_08:    ADDQ.B    #1,D2
  446.         BNE.B    .GPSub2_09
  447.         MOVE.B    (A0)+,D2
  448.         LSL.W    #8,D2
  449.         MOVE.B    (A0)+,D2
  450.         LSL.L    #8,D2
  451. .GPSub2_09:    MOVE.B    (A0)+,D2
  452.         LSL.L    #8,D2
  453.         MOVE.B    (A0)+,D2
  454.         SUBQ.L    #1,D2
  455.         MOVE.L    D2,D3
  456.         SWAP    D3
  457. .GPSub2_10:    MOVE.B    D1,(A1)+
  458.         DBF    D2,.GPSub2_10
  459.         DBF    D3,.GPSub2_10
  460.         BRA.B    .GPSub2_01
  461. .End        MOVEM.L    (A7)+,D0-D2/A3/A5/A6
  462.         RTS
  463.  
  464. Data1        EQU    -2
  465. Data2        EQU    -4
  466. Data3        EQU    -6
  467. Data4        EQU    -8
  468.  
  469. GPSub3:        MOVEM.L    D0-D2/D7/A2/A4-A6,-(A7)
  470.         LINK    A4,#-8
  471.         move.w    #$FF,Data1(A4)
  472.         moveq    #-2,D0
  473.         move.w    D0,Data2(A4)
  474.         move.w    D0,Data3(A4)
  475.         move.w    D0,Data4(A4)
  476.         move.b    (A0)+,D3
  477.         lsl.w    #8,D3
  478.         move.b    (A0)+,D3
  479.         lsl.l    #8,D3
  480.         move.b    (A0)+,D3
  481.         lsl.l    #8,D3
  482.         move.b    (A0)+,D3
  483.         subq.l    #1,D3
  484.         move.l    D3,D5
  485.         swap    D5
  486.         move.b    (A0)+,D4
  487.         lsl.w    #8,D4
  488.         move.b    (A0)+,D4
  489.         moveq    #0,D6
  490.         move.b    (A0)+,D6
  491.         movem.l    D3-D6,-(A7)
  492.         moveq    #2,D5
  493.         move.l    #$100,D6
  494.         moveq    #0,D7
  495.         moveq    #0,D0
  496.         move.b    (A0)+,D0
  497.         movea.l    A2,A6
  498.         move.l    D0,D1
  499.         add.l    D1,D1
  500.         lea    Data1(A4),A5
  501. .GPSub3_01:    moveq    #0,D2
  502.         moveq    #0,D4
  503.         move.b    (A0)+,D2
  504.         move.b    (A0)+,D4
  505.         add.w    D4,(A5)
  506.         add.w    D4,(A5)
  507.         add.w    D2,D4
  508.         move.w    D2,(A6)
  509.         adda.l    D1,A6
  510.         move.w    D4,(A6)
  511.         adda.l    D1,A6
  512.         move.w    D6,(A6)
  513.         add.w    D2,D2
  514.         sub.w    D2,(A6)
  515.         lsr.w    #1,D2
  516.         adda.l    D1,A6
  517.         move.w    D7,(A6)
  518.         sub.w    D4,(A6)
  519.         suba.l    D1,A6
  520.         suba.l    D1,A6
  521.         suba.l    D1,A6
  522.         addq.l    #2,A6
  523.         move.l    D5,D3
  524.         sub.l    D4,D3
  525.         add.l    D3,D7
  526.         sub.l    D2,D4
  527.         add.l    D4,D6
  528.         add.l    D4,D6
  529.         move.l    D2,D5
  530.         add.l    D5,D5
  531.         subq.w    #1,D0
  532.         bne.s    .GPSub3_01
  533.         add.w    D1,Data2(A4)
  534.         lea    Data3(A4),A5
  535.         add.w    D1,(A5)
  536.         add.w    D1,(A5)
  537.         add.w    D1,(A5)
  538.         lea    Data4(A4),A5
  539.         add.w    D1,(A5)
  540.         add.w    D1,(A5)
  541.         lsl.l    #2,D1
  542.         lea    (A2,D1.L),A6
  543.         movea.l    A6,A5
  544.         move.w    Data1(A4),D0
  545. .GPSub3_02:    move.b    (A0)+,(A5)+
  546.         dbra    D0,.GPSub3_02
  547.         movem.l    (A7)+,D3-D6
  548.         movea.l    A2,A5
  549.         adda.l    D6,A5
  550.         adda.l    D6,A5
  551.         subq.l    #2,A5
  552.         moveq    #0,D1
  553. .GPSub3_03:    cmp.w    D6,D1
  554.         bcs.s    .GPSub3_04
  555.         sub.w    D6,D1
  556.         rol.w    D6,D0
  557.         move.w    D0,D2
  558.         and.w    D4,D2
  559.         movea.l    A5,A3
  560.         bra.s    .GPSub3_06
  561.  
  562. .GPSub3_04:    moveq    #0,D2
  563.         movea.l    A2,A3
  564.         dbra    D1,.GPSub3_05
  565.         move.b    (A0)+,D0
  566.         lsl.w    #8,D0
  567.         move.b    (A0)+,D0
  568.         moveq    #15,D1
  569. .GPSub3_05:    add.w    D0,D0
  570.         addx.w    D2,D2
  571. .GPSub3_06:    cmp.w    (A3)+,D2
  572.         dbcc    D1,.GPSub3_05
  573.         bcc.s    .GPSub3_07
  574.         move.b    (A0)+,D0
  575.         lsl.w    #8,D0
  576.         move.b    (A0)+,D0
  577.         moveq    #15,D1
  578.         bra.s    .GPSub3_05
  579.  
  580. .GPSub3_07:    MOVE.W    Data2(A4),D7
  581.         CMP.W    (A3,D7.W),D2
  582.         bcs.s    .GPSub3_08
  583.         
  584.         MOVE.W    Data3(A4),D7
  585.         ADD.W    (A3,D7.W),D2
  586.         move.b    (A6,D2.W),(A1)+
  587.         dbra    D3,.GPSub3_03
  588.         dbra    D5,.GPSub3_03
  589.         BRA.B    .End
  590.  
  591. .GPSub3_08:    MOVE.W    Data4(A4),D7
  592.         add.w    D2,D2
  593.         add.w    (A3,D7.W),D2
  594.         move.b    (A6,D2.W),(A1)+
  595.         move.b    1(A6,D2.W),(A1)+
  596.         subq.w    #2,D3
  597.         bcc.s    .GPSub3_03
  598.         dbra    D5,.GPSub3_03
  599.  
  600. .End        UNLK    A4
  601.         MOVEM.L    (A7)+,D0-D2/D7/A2/A4-A6
  602.         RTS
  603.  
  604. * D3 bytes to copy
  605. * A4 destination
  606. * A3 source
  607. GPmemcpy:    MOVEM.L    D1-D3/A2-A4,-(A7)
  608.         TST.L    D3
  609.         BEQ.B    .End
  610.         LEA    .forwards(PC),A2
  611.         CMPA.L    A3,A4
  612.         BCS.B    .noback
  613.         ADDA.L    D3,A3
  614.         ADDA.L    D3,A4
  615.         LEA    .backwards(PC),A2
  616. .noback:    MOVE.L    D3,D2
  617.         LSR.L    #3,D3
  618.         MOVE.L    D3,D1
  619.         SWAP    D1
  620.         ANDI.W    #7,D2
  621.         ADD.W    D2,D2
  622.         NEG.W    D2
  623.         JMP    (A2,D2.W)
  624.  
  625. .forloop:    MOVE.B    (A3)+,(A4)+
  626.         MOVE.B    (A3)+,(A4)+
  627.         MOVE.B    (A3)+,(A4)+
  628.         MOVE.B    (A3)+,(A4)+
  629.         MOVE.B    (A3)+,(A4)+
  630.         MOVE.B    (A3)+,(A4)+
  631.         MOVE.B    (A3)+,(A4)+
  632.         MOVE.B    (A3)+,(A4)+
  633. .forwards:    DBRA    D3,.forloop
  634.         DBRA    D1,.forloop
  635.         BRA.B    .End
  636.  
  637. .backloop:    MOVE.B    -(A3),-(A4)
  638.         MOVE.B    -(A3),-(A4)
  639.         MOVE.B    -(A3),-(A4)
  640.         MOVE.B    -(A3),-(A4)
  641.         MOVE.B    -(A3),-(A4)
  642.         MOVE.B    -(A3),-(A4)
  643.         MOVE.B    -(A3),-(A4)
  644.         MOVE.B    -(A3),-(A4)
  645. .backwards:    DBRA    D3,.backloop
  646.         DBRA    D1,.backloop
  647. .End:        MOVEM.L    (A7)+,D1-D3/A2-A4
  648.         RTS
  649.         END
  650.